#include "util.h"
#include <stdio.h>
#include <dirent.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <errno.h>

QString stringToHex(const QString &input)
{
   QString hexStr;
   for (int i = 0; i < input.length(); ++i) {
       hexStr.append(QString("%1").arg(input.at(i).unicode(), 2, 16, QChar('0')));
   }
   return hexStr;
}



 void get_child_pids(pid_t parent_pid,QVector<quint64>&vchildPid) {
    DIR *dir;
    struct dirent *entry;
    char path[256];
    char buf[256];
    FILE *fp;
    pid_t ppid, pid;

    QVector<quint64> result;
    printf("Child processes of PID %d:\n", parent_pid);

    dir = opendir("/proc");
    if (!dir) {
        perror("opendir /proc failed");
        return;
    }

    while ((entry = readdir(dir)) != NULL) {
        // 只处理数字命名的目录（进程目录）
        if (entry->d_type == DT_DIR && atoi(entry->d_name) > 0) {
            pid = atoi(entry->d_name);

            // 读取stat文件获取PPID
            snprintf(path, sizeof(path), "/proc/%d/stat", pid);
            fp = fopen(path, "r");
            if (!fp) continue;

            if (fgets(buf, sizeof(buf), fp)) {
                char *token;
                int field = 0;

                // 解析stat文件，PPID是第4个字段
                token = strtok(buf, " ");
                while (token != NULL) {
                    field++;
                    if (field == 4) {
                        ppid = atoi(token);
                        if (ppid == parent_pid) {
                            vchildPid.push_back(pid);
                        }
                        break;
                    }
                    token = strtok(NULL, " ");
                }
            }
            fclose(fp);
        }
    }
    closedir(dir);
}



 int kill_process(pid_t pid) {
     if (kill(pid, SIGTERM) == -1) {
         // 如果 SIGTERM 失败，尝试 SIGKILL
         if (errno == ESRCH) {
             printf("进程 %d 不存在\n", pid);
             return -1;
         } else if (kill(pid, SIGKILL) == -1) {
             perror("无法终止进程");
             return -1;
         }
         printf("已发送 SIGKILL 信号到进程 %d\n", pid);
         return 0;
     }
     printf("已发送 SIGTERM 信号到进程 %d\n", pid);
     return 0;
 }


 std::vector<int> getBase255Digits(int num) {
     std::vector<int> digits(3, 0); // 初始化3位，默认值为0

     // 获取个位
     digits[2] = num % 255;
     num /= 255;

     // 获取十位
     if (num > 0) {
         digits[1] = num % 255;
         num /= 255;
     }

     // 获取百位
     if (num > 0) {
         digits[0] = num % 255;
     }

     return digits;
 }



